wayland: Don't assume drag context has a source window when finalizing
authorJonas Ådahl <jadahl@gmail.com>
Mon, 3 Aug 2015 06:26:39 +0000 (14:26 +0800)
committerJonas Ådahl <jadahl@gmail.com>
Wed, 5 Aug 2015 02:31:55 +0000 (10:31 +0800)
Only a drag context which was created with 'drag_begin' will be
guaranteed to have a source window at all times. Thus, in finalize we
cannot assume we can retrieve a GdkDisplay from the source_window
pointer since it may be NULL. Though, the display is only needed for
contexts created via 'drag_begin' thus we can retrieve it after
checking that is the case.

https://bugzilla.gnome.org/show_bug.cgi?id=749339

gdk/wayland/gdkdnd-wayland.c

index e96aeda337be6c58163ec5f81f699facf578cf38..835b6d08e25a87b6706186c1a0f7c497c644a29a 100644 (file)
@@ -64,13 +64,20 @@ gdk_wayland_drag_context_finalize (GObject *object)
 {
   GdkWaylandDragContext *wayland_context = GDK_WAYLAND_DRAG_CONTEXT (object);
   GdkDragContext *context = GDK_DRAG_CONTEXT (object);
-  GdkDisplay *display = gdk_window_get_display (context->source_window);
 
   contexts = g_list_remove (contexts, context);
 
-  if (context->is_source &&
-      gdk_selection_owner_get_for_display (display, gdk_drag_get_selection (context)) == context->source_window)
-    gdk_wayland_selection_unset_data_source (display, gdk_drag_get_selection (context));
+  if (context->is_source)
+    {
+      GdkDisplay *display = gdk_window_get_display (context->source_window);
+      GdkAtom selection;
+      GdkWindow *selection_owner;
+
+      selection = gdk_drag_get_selection (context);
+      selection_owner = gdk_selection_owner_get_for_display (display, selection);
+      if (selection_owner == context->source_window)
+        gdk_wayland_selection_unset_data_source (display, selection);
+    }
 
   if (wayland_context->data_source)
     wl_data_source_destroy (wayland_context->data_source);